babl: add separate functions for 1.8 and 2.2 gamma
authorØyvind Kolås <pippin@gimp.org>
Thu, 31 Aug 2017 03:32:42 +0000 (05:32 +0200)
committerØyvind Kolås <pippin@gimp.org>
Thu, 31 Aug 2017 03:32:42 +0000 (05:32 +0200)
babl/babl-trc.c
babl/babl-trc.h

index 89922006514978b052039bbeb78a834a29bcd083..3b32f74b7e1bdb857b625c0038c5abe0cf4c97a9 100644 (file)
@@ -112,6 +112,14 @@ babl_trc_new (const char *name,
       trc_db[i].fun_to_linear = _babl_trc_gamma_to_linear;
       trc_db[i].fun_from_linear = _babl_trc_gamma_from_linear;
       break;
+    case BABL_TRC_GAMMA_2_2:
+      trc_db[i].fun_to_linear = _babl_trc_gamma_2_2_to_linear;
+      trc_db[i].fun_from_linear = _babl_trc_gamma_2_2_from_linear;
+      break;
+    case BABL_TRC_GAMMA_1_8:
+      trc_db[i].fun_to_linear = _babl_trc_gamma_1_8_to_linear;
+      trc_db[i].fun_from_linear = _babl_trc_gamma_1_8_from_linear;
+      break;
     case BABL_TRC_SRGB:
       trc_db[i].fun_to_linear = _babl_trc_srgb_to_linear;
       trc_db[i].fun_from_linear = _babl_trc_srgb_from_linear;
@@ -144,14 +152,19 @@ babl_trc_gamma (double gamma)
 {
   char name[32];
   int i;
-  if (fabs (gamma - 1.0) < 0.0001)
+  if (fabs (gamma - 1.0) < 0.01)
      return babl_trc_new ("linear", BABL_TRC_LINEAR, 1.0, 0, NULL);
+  if (fabs (gamma - 1.8) < 0.01)
+     return babl_trc_new ("1.8", BABL_TRC_GAMMA_1_8, 1.8, 0, NULL);
+  if (fabs (gamma - 2.2) < 0.01)
+     return babl_trc_new ("2.2", BABL_TRC_GAMMA_2_2, 2.2, 0, NULL);
+
   sprintf (name, "%.6f", gamma);
   for (i = 0; name[i]; i++)
     if (name[i] == ',') name[i] = '.';
   while (name[strlen(name)-1]=='0')
     name[strlen(name)-1]='\0';
-  return babl_trc_new (name,   BABL_TRC_GAMMA, gamma, 0, NULL);
+  return babl_trc_new (name, BABL_TRC_GAMMA, gamma, 0, NULL);
 }
 
 void
index caec30cb4accad61ee91a4e7bc38a1f01fcdc254..dbdf2feffec31a4a2b06e1e9fe8451893ad962d1 100644 (file)
@@ -27,8 +27,11 @@ BABL_CLASS_DECLARE (trc);
 
 typedef enum {BABL_TRC_LINEAR,
               BABL_TRC_GAMMA,
+              BABL_TRC_GAMMA_1_8,
+              BABL_TRC_GAMMA_2_2,
               BABL_TRC_SRGB,
-              BABL_TRC_LUT} BablTRCType;
+              BABL_TRC_LUT}
+BablTRCType;
 
 typedef struct
 {
@@ -374,6 +377,26 @@ static inline float _babl_trc_gamma_from_linear (const Babl *trc_, float value)
   return babl_powf (value, trc->rgamma);
 }
 
+static inline float _babl_trc_gamma_2_2_to_linear (const Babl *trc_, float value)
+{
+  return babl_powf (value, 2.2);
+}
+
+static inline float _babl_trc_gamma_2_2_from_linear (const Babl *trc_, float value)
+{
+  return babl_powf (value, 1.0/2.2);
+}
+
+static inline float _babl_trc_gamma_1_8_to_linear (const Babl *trc_, float value)
+{
+  return babl_powf (value, 1.8);
+}
+
+static inline float _babl_trc_gamma_1_8_from_linear (const Babl *trc_, float value)
+{
+  return babl_powf (value, 1.0/1.8);
+}
+
 static inline float _babl_trc_srgb_to_linear (const Babl *trc_, float value)
 {
   return babl_gamma_2_2_to_linear (value);